# 编译器设置
CXX := g++
CXXFLAGS := -std=c++11 -g -Wall -Wextra -MMD -MP
LDFLAGS :=
LDLIBS := -llog4cpp -lmysqlclient -lcrypt

# 自动发现目录结构
# 查找所有包含 .cc 文件的目录
SRC_DIRS := $(shell find . -name '*.cc' -exec dirname {} \; | sort -u)
# 查找所有包含 .h 或 .hpp 文件的目录（作为头文件搜索路径）
INC_DIRS := $(shell find . -name '*.h' -o -name '*.hpp' | xargs -n1 dirname | sort -u)
# 添加 -I 前缀到每个包含目录
INC_FLAGS := $(addprefix -I, $(INC_DIRS))

# 构建目录
BUILD_DIR := ./build
# 查找所有 .cc 文件
SRCS := $(shell find . -name '*.cc')
# 生成对应的 .o 文件路径（在 build 目录下保持相同结构）
OBJS := $(SRCS:%.cc=$(BUILD_DIR)/%.o)
# 生成依赖文件
DEPS := $(OBJS:.o=.d)

# 最终目标
TARGET := $(BUILD_DIR)/main

# 默认目标
all: $(TARGET)

# 链接目标
$(TARGET): $(OBJS)
	@mkdir -p $(@D)
	$(CXX) $(OBJS) -o $@ $(LDFLAGS) $(LDLIBS)

# 编译每个源文件
$(BUILD_DIR)/%.o: %.cc
	@mkdir -p $(@D)
	$(CXX) $(CXXFLAGS) $(INC_FLAGS) -c $< -o $@

# 包含自动生成的依赖关系
-include $(DEPS)

# 运行程序
run: $(TARGET)
	@echo "Running $(TARGET)..."
	@./$(TARGET)

# 清理构建文件
clean:
	rm -rf $(BUILD_DIR)

# 显示项目信息
info:
	@echo "Source directories: $(SRC_DIRS)"
	@echo "Include directories: $(INC_DIRS)"
	@echo "Source files: $(SRCS)"
	@echo "Object files: $(OBJS)"
	@echo "Target: $(TARGET)"

.PHONY: all run clean info
